/// <reference path="jquery.min.js" />
/// <reference path="jquery.cookie.js" />
/// <reference path="layer/layer.js" />
//枚举
//全局污染 枚举变量 
var ___Enum = {
    //状态
    status: {
        "0": "禁用",
        "1": "启用"
    },
    //性别
    sex: {
        "0": "女",
        "1": "男"
    }
}
/*
 * 获取枚举对应的值
 * t ：代表对应的枚举类
 */
String.prototype.format_enum = function (t) {
    return eval("___Enum." + t + "[this.slice()]");
}

/*封装常用的事件包括 ajax*/
$.extend({
    http: {
        /*
         * 基础ajax封装
         */
        request: function (_url, _data, _success, opts) {
            //ajax 请求
            var token = $.cookie("o_autn_token");
            if (token === undefined || token == null || token == "") {
                token = "";
            }
            if (_success === undefined) {
                _success = {};
            }
            _url = "填写你的webapi地址/" + _url;
            var o = $.extend({
                url: _url,
                headers: { "O-Auth-Token": token },
                contentType: "application/json",
                data: JSON.stringify(_data),
                dataType: "json",
                success: function (data, status, jqXHR) {
                    if ($.isHttpRequestResult(data)) {
                        _success.pass(data, status, jqXHR);
                    } else {

                        //过期 重新登录 跳转登录页面
                        if (data.Errcode == 40002 || data.Errcode == 40000) {
                            top.window.location.href = "/login.html";
                            return;
                        }
                        //无权访问该页面
                        if (data.Errcode == 4030) {
                            window.location.href = "";
                            //return;
                        }
                        _success.error(data, status, jqXHR);
                    }
                },
                type: "post"
            }, opts);
            $.ajax(o);
        },
        /*
         * ajax 调用 返回json
         * url 请求地址
         * data 数据
         * sufu 成功回调{pass:function(){},error:function:(){}}
         * opts.msg 请求前会自动 出现一个加载框
         * opts.jquery 参考jquery ajax参数设置
         *  当使用 close回调后，会多加一个close(index)回调方法 index=关闭弹层的索引
         */
        json: function (url, data, sufu, opts) {
            var _layerIndex = 0;
            if (opts === undefined) { opts = {} };
            if (!opts.hasOwnProperty("msg")) {
                opts.msg = "提交中...";
            }
            opts.jquery = { dataType: "json" };
            //如果不关闭
            if (opts.msg) {
                opts.jquery.beforeSend = function () {
                    _layerIndex = layer.msg(opts.msg, { icon: 16, shade: 0.3, time: 0 });
                }
            }
            if (opts.hasOwnProperty("close")) {
                opts.close(_layerIndex);

            } else {
                //自动关闭 让jquery事件去做
                opts.jquery = $.extend(opts.jquery, {
                    complete: function () {
                        layer.close(_layerIndex);
                    }
                });
            }
            $.http.request(url, data, sufu, opts.jquery);
        },

        /*
         * ajax 调用 返回text
         * url 请求地址
         * data 数据
         * sufu 成功回调{pass:function(){},error:function:(){}}
         * opts.msg 请求前会自动 出现一个加载框
         * opts.jquery 参考jquery ajax参数设置
         *  当使用 complete回调后，会多加一个close(index)回调方法 index=关闭弹层的索引
         */
        text: function (url, data, sufu, opts) {
            $.http.json(url, data, sufu, $.extend({ jquery: { dataType: "text" } }, opts));
        }

    },
    /*
     * 计算页码分析
     */
    CalculatePage: function (pageCount, pageSize) {
        return parseInt((pageCount % pageSize) == 0 ? pageCount / pageSize : pageCount / pageSize + 1);
    },
    /*
     * 判断 http请求结果
     */
    isHttpRequestResult: function (o) {
        if (o == null || o == "") { return true; }
        if (o.hasOwnProperty("Errcode")) {
            if (o.Errcode > 0 || o.Errcode < 0) {
                return false;
            }
            return true;
        }
        return true;
    }
})

/*
 * 封装弹窗
 * 依赖 layer.min.js or layer.js
 */
$.extend({
    /*
     * alter方法
     */
    alert: function (a, b, d) {
        return layer.alert(a, b, d);
    },
    /*
     * 返回索引
     */
    confirm: function (c, opts) {
        if (typeof (opts) == "function") {
            return layer.confirm(c, { icon: 3, yes: opts });
        }
        opts = $.extend({ icon: 3 }, opts);
        return layer.confirm(c, opts);
    },
    /*
     * 成功提示信息
     *  c:内容
     *  e:回调函数
     *  o:自定义参数
     */
    msgSucceed: function (c, o) {
        o = $.extend({ offset: '2px', shift: 7, icon: 1, time: 3000 }, o);
        return layer.msg(c, o);
    },
    /*
     * 失败提示
     */
    msgFall: function (c, o) {
        o = $.extend({ offset: '2px', shift: 6, icon: 2, time: 3000 }, o);
        return layer.msg(c, o);
    },
    /*
     * 预加载
     */
    pageLoad: function (c, opts) {
        if (undefined === c) { c = "正在载入中..."; }
        return layer.msg(c, { icon: 16, shade: [0.8, '#393D49'], time: 0 }, opts);
    },

    /*
     * 弹出ifram
     * src 路径 必填
     * title 标题 
     * wh 高跟宽 数组
     */
    iframe: function (src, title, wh, opts) {
        if (title === undefined) { title: false; }
        if (wh === undefined) { wh = [($(window).width() - 30) + 'px', ($(window).height() - 30) + 'px'] }
        if (opts === undefined) {
            opts = $.extend({}, {
                type: 2,
                title: title,
                shadeClose: false,
                maxmin: true,
                area: wh,
                shade: [0.1, '#000'],
                content: src
            }, opts);
        }
        return layer.open(opts);
    },
    /*
     * 页面层
     */
    layrePage: function (opts) {
        return layer.open($.extend({
            type: 1,
            area: ['420px', '240px'] //宽高
        }, opts));
    },
    /*
     * 关闭弹窗的事件
     */
    layreClose: function (index) {
        return layer.close(index);
    }
})


/*
 * 绑定 document 的值 多用于表单绑定
 * 目前用于建设简单的数据绑定
 * data ={} 对象
 * 它需要你指向 dom的指令为 {key}
 */
$.fn.bindDocumentData = function (data) {
    if (data === undefined) { return; }
    var _htmlChange = this.prop("outerHTML");
    $.each(data, function (d_key, d_v) {
        _htmlChange = _htmlChange.replace("{" + d_key + "}", d_v);
    });
    this.replaceWith(_htmlChange);
}

/*
 * 基于form提交继承的获取数据
 * opts 类型 {}
 * opts.checkboxOutType 多选输出类型
 * opts.addData 合并参数
 * opts.overrideData 重写数据 会返回一个源数据
 */
$.fn.getFormData = function (opts) {
    /*
     * 获取对应的表单值
     */
    function getFormValues(obj, type) {
        if (type == "" || type == null || type === undefined) { return $(obj).val(); }
        if (type == "val") { return $(obj).val(); }
        if (type == "text") { return $(obj).text(); }
        if (type == "html") { return $(obj).html(); }
        return $(obj).attr(type);
    }

    function _getFormJson(obj) {
        var _json = {};
        $(obj).find("*[data-form]").each(function (i, dom) {
            var ot = $(dom).attr("data-form");
            var keyName = ot.split("&")[0];
            var valType = ot.split("&")[1];
            if ($(dom).prop("tagName").toLocaleLowerCase() == "input") {
                var dom_type = $(dom).attr("type");
                if (dom_type == "radio") {
                    _json[keyName] = $("input[data-form='" + keyName + "']:checked").val();
                } else if (dom_type == "checkbox") {
                    var ckarr = $("input[data-form='" + keyName + "']:checked").map(function () { return $(this).val(); }).get();
                    if (typeof (opts.checkboxOutType) == "string") {
                        _json[keyName] = ckarr.join(opts.checkboxOutType);
                    } else {
                        _json[keyName] = ckarr;
                    }
                } else {
                    _json[keyName] = getFormValues(this, valType);
                }
            } else {
                _json[keyName] = getFormValues(this, valType);
            }
        });
        return _json;
    }
    var _vjson = {};
    if (opts === undefined) { opts = {}; }
    //默认多选为数组
    if (!opts.hasOwnProperty("checkboxOutType"))
        opts.checkboxOutType = ",";
    if (this.length > 1) {
        this.each(function (top_i, top_dom) {
            var top_key = $(top_dom).attr("data-form-key");
            _vjson[top_key] = _getFormJson(top_dom);
        })
    } else {
        _vjson = _getFormJson(this);
    }
    if (_vjson.leng <= 0) { return; }
    _vjson = $.extend(_vjson, opts.addData);
    if (opts.hasOwnProperty("overrideData")) {
        return opts.overrideData(_vjson);
    }
    return _vjson;
}


/*
 * 表单提交
 * data-form="key&type" => key&type(键&指定类型[val(可为空)/text/html])
 * url ：ajax提交后台的地址
 * successFun 成功回调函数
 * opts:可选参数
 *  opts.jquery 为jquery库正规参数
 *  opts.addData 合并这个数据
 * 	opts.onUpateData 更新数据源 必须返回
 *  opts.checkboxOutType 可指定选中的多选输出格式,[]=数组输出 ","=,分割 可以是任意字符串 默认,分割
 *  opts.valid 是否开启验证，默认开始
 */
$.fn.ajaxFormSubmit = function (url, successFun, opts) {
	/*
	 * 获取对应的表单值
	 */
    function getFormValues(obj, type) {
        if (type == "" || type == null || type === undefined) {
            return $(obj).val();
        }
        if (type == "val") {
            return $(obj).val();
        }
        if (type == "text") {
            return $(obj).text();
        }
        if (type == "html") {
            return $(obj).html();
        }
        if ($(obj).prop("tagName").toLocaleLowerCase() == "select") {
            return $(obj).children("option:selected").attr(type);
        }
        return $(obj).attr(type);
    }

    function _getFormJson(obj) {
        var _json = {};
        $(obj).find("*[data-form]").each(function (i, dom) {
            var ot = $(dom).attr("data-form");
            var keyName = ot.split("&")[0];
            var valType = ot.split("&")[1];
            if ($(dom).prop("tagName").toLocaleLowerCase() == "input") {
                var dom_type = $(dom).attr("type");
                if (dom_type == "radio") {
                    _json[keyName] = $("input[data-form='" + keyName + "']:checked").val();
                } else if (dom_type == "checkbox") {
                    var ckarr = $("input[data-form='" + keyName + "']:checked").map(function () {
                        return $(this).val();
                    }).get();
                    if (typeof (opts.checkboxOutType) == "string") {
                        _json[keyName] = ckarr.join(opts.checkboxOutType);
                    } else {
                        _json[keyName] = ckarr;
                    }
                } else {
                    _json[keyName] = getFormValues(this, valType);
                }
            } else {
                _json[keyName] = getFormValues(this, valType);
            }
        });
        return _json;
    }
    var vjson = {};
    opts = Object.assign({ checkboxOutType: ",", valid: true, on: { checkFall: function () { } } }, opts);
    if (this.length > 1) {
        this.each(function (top_i, top_dom) {
            var top_key = $(top_dom).attr("data-form-key");
            vjson[top_key] = _getFormJson(top_dom);
        })
    } else {
        vjson = _getFormJson(this);
    }
    if (vjson.leng <= 0) {
        return;
    }
    vjson = Object.assign(vjson, opts.addData);
    var postData = opts.hasOwnProperty("onEditData") == false ? vjson : opts.onEditData(vjson);

    var _Opts = Object.assign({
        msg: "请稍等...",
        showMsg: true
    }, opts);

    if (_Opts.showMsg) {
        _Opts.jquery = {
            beforeSend: function () {
                $.load(_Opts.msg);
            },
            complete: function () {
                $.loadClose();
            }
        };
    };
    //验证
    if (opts.valid) {
        if (this.formValid().check() == false) {
            opts.on.checkFall(false);
            return;
        }
    }
    $.http.request(url, postData, successFun, _Opts.jquery);
};

/*
 * 获取一组 多选的值
 * at 默认获取value 否则获取 attr属性
 * type 默认,分割 否则自定义分割
 */
$.fn.getCheckedData = function (opts) {
    if (opts === undefined || opts == null) { opts = { at: "", type: "," } };
    if (typeof (opts.type) === "object") {
        return this.map(function () {
            return opts.at == "" ? $(this).val() : $(this).attr(opts.at);
        }).get();
    }
    return this.map(function () {
        return opts.at == "" ? $(this).val() : $(this).attr(opts.at);
    }).get().join(opts.type);
}

/*
 * 扩展 类似于CS里面的占位方法
 */
String.prototype.Format = function () {
    if (arguments.length == 0) return this;
    for (var s = this, i = 0; i < arguments.length; i++)
        s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i] == null ? "" : arguments[i]);
    return s;
};

/*
 * 格式化时间 JS JSON格式
 * 参数 格式化类型
 * 依赖 moment.js
 */
Date.prototype.Dateformat = function (o) {
    if (o === undefined) { o = 'YYYY年MM月DD日 HH:mm:ss a' }
    return moment(this.slice()).format(o);
}
/*
 * 格式化时间 JS JSON格式
 * 参数 格式化类型
 * 依赖 moment.js
 */
String.prototype.Dateformat = function (o) {
    if (o === undefined) { o = 'YYYY年MM月DD日 HH:mm:ss a' }
    return moment(this.slice()).format(o);
}

//升序
Array.prototype.sortAsce = function (key) {
    return this.sort(function (a, b) { return (a[key] > b[key]) ? 1 : -1 })
}
//降序
Array.prototype.sortAsc = function (key) {
    return this.sort(function (a, b) { return (a[key] < b[key]) ? 1 : -1 })
}
/**
 * 获取url参数
 * @param name
 */
String.prototype.URL_Query = function (name) {
    var reg = new RegExp("(^|&|\\?)" + name + "=([^&]*)(&|$)", "i");
    var r;
    try {
        r = unescape(this.slice().match(reg)[2]);
    } catch (e) {
        r = null;
    }
    if (r != null) return unescape(r);
    return null;
}
/**
 * 获取当前路径的参数
 * @param name
 */
function PageUrlQuery(name) {
    return window.location.href.URL_Query(name);
}

/*模板渲染 依赖template-web.js*/
$.fn.showHtml = function (data, id) {
    if (id === undefined) { id = "app"; }
    var renderHtml = template(id, opts.data);
    this.html(renderHtml);
}